package com.demo.article;

import cn.hutool.core.collection.CollUtil;

import com.demo.article.mapper.ArticleMapper;
import com.demo.article.pojo.Article;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.TestOnly;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description  爬取 新闻 文章
 * @Author Pan
 * @Date 2023年2月11日08:41:55
 */

@Slf4j
@SpringBootTest
public class MyHtmlParseUtil {

    @Autowired
    private ArticleMapper articleMapper;

    @Test
    public void getArticles() throws IOException {
        //目标 爬取 新闻文章
        //请求url
        String url = "https://www.sina.com.cn";
        ArrayList<Article> articles = new ArrayList<>();

            //解析网页
            Document document = Jsoup.parse(new URL(url), 5000);
//            System.out.println(document);

            //获取新闻列表
            Element ListNews= document.getElementById("newslist_a");
//            System.out.println(ListNews);

            // 断言
            assert ListNews != null;

            Elements elementsByTag = ListNews.getElementsByTag("li");

            //温馨提示:爬取网易新闻全部资源
            // 需要二次爬取(爬第一次的链接后再爬取获取作者 时间 图片)
            // 对于网易导入的外部资源链接(无法处理) 爬取少量信息
            for (Element el : elementsByTag) {
                //文章链接
                String articleUrl = el.getElementsByTag("a").eq(0).attr("href");

                //文章标题
                String title = el.getElementsByTag("a").eq(0).text();

                //进入文章 链接里
                Document articleContext = Jsoup.parse(new URL(articleUrl), 5000);

                //获取文章 作者 + 时间
                Element titleArea = articleContext.getElementById("top_bar");

                String datatime;
                String author;

                if(titleArea != null){
                    datatime = titleArea.getElementsByTag("span").eq(0).text();
                    author = titleArea.getElementsByTag("a").eq(0).text();
                    log.info("标题：" + title);
                    log.info("时间：" + datatime);
                    log.info("作者：" + author);
                }else {
                    continue;
                }

                //获取正文
                Element content = articleContext.getElementById("article");

                if(content != null){
                    String imgUrl = content.getElementsByTag("img").eq(0).attr("src");
                    log.info("照片：" + imgUrl);

                    String article = content.getElementsByTag("p").eq(0).text();
                    log.info("正文第一段：" + article);

                    // 这里有信息才会保存

                    Article a = new Article();
                    a.setTitle(title);
                    a.setAuthor(author);
                    a.setDate(datatime);
                    a.setImg(imgUrl);
                    a.setUrl(articleUrl);

                    // 保存到数据库
                    int res = articleMapper.insert(a);
                    System.out.println(res);

                }


            }
            //对数组 去重处理 以后万一  [新闻页面 容易重复] 新闻展示 北京新闻 全球新闻 有些会重复
            articles = CollUtil.distinct(articles);
            articles.forEach(toSaveArticle ->
            {
                log.info("文章:" + toSaveArticle);
            });


//        List<Article> ar = articleMapper.selectList(null);

    }



}
